package ice.server.comm;

import org.apache.commons.lang3.StringUtils;

import java.util.HashMap;
import java.util.Map;

/**
 * 构建查询map的工具类，支持流式写法
 * @author zhangrb
 * @user zhangrb
 * @date 2019-8-2
 */
public class ParamBulider {

    private Map<String, Object> map = new HashMap<>();

    /**
     * 构建类
     * @author zhangrb
     * @user zhangrb
     * @date 2019-8-2
     * @return 构建对象
     */
    public static ParamBulider build() {
        return new ParamBulider();
    }

    /**
     * 添加查询条件
     * @author zhangrb
     * @user zhangrb
     * @date 2019-8-2
     * @param proExpression 查询条件表达式
     * @param val 值
     * @return 构建对象
     */
    public ParamBulider add(String proExpression, Object val) {
        if(StringUtils.isNotEmpty(val.toString())){
            map.put(proExpression, val);
        }
        return this;
    }

    /**
     * 添加equal条件的快捷方式,
     * @author zhangrb
     * @user zhangrb
     * @date 2019-8-2
     * @param pro po的属性名称
     * @param val 值
     * @return 构建对象
     */
    public ParamBulider addEqual(String pro, Object val) {
        map.put(pro, val);
        return this;
    }

    /**
     * 添加not equal条件的快捷方式,
     * @author zhangrb
     * @user zhangrb
     * @date 2019-8-2
     * @param pro po的属性名称
     * @param val 值
     * @return 构建对象
     */
    public ParamBulider addNotEqual(String pro, Object val) {
        map.put(pro + Constants.NE_SF, val);
        return this;
    }

    /**
     * 添加between and条件的快捷方式,
     * @author zhangrb
     * @user zhangrb
     * @date 2019-8-2
     * @param pro po的属性名称
     * @param val 值
     * @return 构建对象
     */
    public ParamBulider addBeweenAnd(String pro, Object val) {
        map.put(pro + Constants.BT_SF, val);
        return this;
    }

    /**
     * 添加contains条件的快捷方式,
     * @author zhangrb
     * @user zhangrb
     * @date 2019-8-2
     * @param pro po的属性名称
     * @param val 值
     * @return 构建对象
     */
    public ParamBulider addContains(String pro, Object val) {
        map.put(pro + Constants.CONS_SF, val);
        return this;
    }

    /**
     * 添加empty条件的快捷方式,
     * @author zhangrb
     * @user zhangrb
     * @date 2019-8-2
     * @param pro po的属性名称
     * @return 构建对象
     */
    public ParamBulider addEmpty(String pro) {
        map.put(pro + Constants.EMPTY_SF, null);
        return this;
    }

    /**
     * 添加not empty条件的快捷方式,
     * @author zhangrb
     * @user zhangrb
     * @date 2019-8-2
     * @param pro po的属性名称
     * @return 构建对象
     */
    public ParamBulider addNotEmpty(String pro) {
        map.put(pro + Constants.NOTEMPTY_SF, null);
        return this;
    }

    /**
     * 添加end with条件的快捷方式,
     * @author zhangrb
     * @user zhangrb
     * @date 2019-8-2
     * @param pro po的属性名称
     * @return 构建对象
     */
    public ParamBulider addEndWith(String pro, String val) {
        map.put(pro + Constants.EW_SF, val);
        return this;
    }

    /**
     * 添加end with条件的快捷方式,
     * @author zhangrb
     * @user zhangrb
     * @date 2019-8-2
     * @param pro po的属性名称
     * @return 构建对象
     */
    public ParamBulider addStartWith(String pro, String val) {
        map.put(pro + Constants.SW_SF, val);
        return this;
    }

    /**
     * 添加大于等于条件的快捷方式,
     * @author zhangrb
     * @user zhangrb
     * @date 2019-8-2
     * @param pro po的属性名称
     * @return 构建对象
     */
    public ParamBulider addGreaterOrEquals(String pro, String val) {
        map.put(pro + Constants.GE_SF, val);
        return this;
    }

    /**
     * 添加大于条件的快捷方式,
     * @author zhangrb
     * @user zhangrb
     * @date 2019-8-2
     * @param pro po的属性名称
     * @return 构建对象
     */
    public ParamBulider addGreater(String pro, String val) {
        map.put(pro + Constants.GT_SF, val);
        return this;
    }

    /**
     * 添加小于等于条件的快捷方式,
     * @author zhangrb
     * @user zhangrb
     * @date 2019-8-2
     * @param pro po的属性名称
     * @return 构建对象
     */
    public ParamBulider addLittleOrEquals(String pro, String val) {
        map.put(pro + Constants.LE_SF, val);
        return this;
    }

    /**
     * 添加小于条件的快捷方式,
     * @author zhangrb
     * @user zhangrb
     * @date 2019-8-2
     * @param pro po的属性名称
     * @return 构建对象
     */
    public ParamBulider addLittle(String pro, String val) {
        map.put(pro + Constants.LT_SF, val);
        return this;
    }

    /**
     * 添加in条件的快捷方式,
     * @author zhangrb
     * @user zhangrb
     * @date 2019-8-2
     * @param pro po的属性名称
     * @return 构建对象
     */
    public ParamBulider addIn(String pro, String val) {
        map.put(pro + Constants.IN_SF, val);
        return this;
    }

    /**
     * 添加not in条件的快捷方式,
     * @author zhangrb
     * @user zhangrb
     * @date 2019-8-2
     * @param pro po的属性名称
     * @return 构建对象
     */
    public ParamBulider addNotIn(String pro, String val) {
        map.put(pro + Constants.NOTIN_SF, val);
        return this;
    }
    
    /**
     * 添加分页条件的快捷方式,
     * @author zhangrb
     * @user zhangrb
     * @date 2019-8-2
     * @param page 第几页
     * @param rows 每页几条
     * @return 构建对象
     */
    public ParamBulider addPageAndRow(int page, int rows) {
        map.put(Constants.PAGE, page);
        map.put(Constants.ROWS, rows);
        return this;
    }
    
    /**
     * 添加降序条件的快捷方式,
     * @author zhangrb
     * @user zhangrb
     * @date 2019-8-2
     * @param pro po属性
     * @return 构建对象
     */
    public ParamBulider addOrderDesc(String pro) {
        map.put(Constants.ORDERBY + pro,"desc");
        return this;
    }
    
    /**
     * 添加升序条件的快捷方式,
     * @author zhangrb
     * @user zhangrb
     * @date 2019-8-2
     * @param pro po属性
     * @return 构建对象
     */
    public ParamBulider addOrderAsc(String pro) {
        map.put(Constants.ORDERBY + pro,"asc");
        return this;
    }

    public Map<String, Object> get() {
        return map;
    }

    public static void main(String[] args) {
        Map<String, Object> pm = ParamBulider.build().addEqual("username", "lisi").addEqual("state",0).get();
    }
}
